package main

import "fmt"

// 删除有序数组中的重复项：给你一个有序数组 nums ，请你原地删除重复出现的元素，
// 使每个元素只出现一次，返回删除后数组的新长度。不要使用额外的数组空间，
// 你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。可以使用双指针法，
// 一个慢指针 i 用于记录不重复元素的位置，一个快指针 j 用于遍历数组，当 nums[i] 与 nums[j] 不相等时，
// 将 nums[j] 赋值给 nums[i + 1]，并将 i 后移一位。

func removeDuplicates(nums []int) int {
	// 边界条件：空数组直接返回0
	if len(nums) == 0 {
		return 0
	}

	// 慢指针i：记录不重复元素的最后位置（初始指向第一个元素）
	i := 0
	// 快指针j：遍历整个数组（从第二个元素开始）
	for j := 1; j < len(nums); j++ {
		// 当快慢指针指向的元素不同时，说明找到新的不重复元素
		if nums[j] != nums[i] {
			// 慢指针后移一位，用于存放新的不重复元素
			i++
			// 将快指针指向的元素复制到慢指针位置
			nums[i] = nums[j]
		}
		// 若元素相同，快指针继续后移（跳过重复元素）
	}

	// 不重复元素的长度为慢指针索引+1（因为索引从0开始）
	return i + 1
}

func main() {
	nums1 := []int{1, 1, 2}
	len := removeDuplicates(nums1)
	fmt.Println(len)         // 输出：2
	fmt.Println(nums1[:len]) //[1,2]

	nums2 := []int{0, 0, 1, 1, 1, 2, 2, 3, 3, 4}
	len2 := removeDuplicates(nums2)
	fmt.Println(len2)         // 输出：5
	fmt.Println(nums2[:len2]) //[0,1,2,3,4]
}
